#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

const int maxn=101, len=10, k=1000000000;

void add(int *c, int *a, int *b) {
    c[0] = max(a[0], b[0]);
    c[1] = 0;
    for (int i=1; i<=c[0]; i++) {
        c[i] += a[i]+b[i];
        c[i+1] = c[i]/k;
        c[i] %= k;
    }
    if (c[c[0]+1]) c[0]++;
}

void dec(int *c, int *a, int *b) {
    c[1] = 0;
    for (int i=1; i<=a[0]; i++) {
        c[i] += a[i]-b[i];
        if (c[i]<0) {
            c[i+1] = -1;
            c[i]+=k;
        } else c[i+1]=0;
    }
    c[0] = c[a[0]] ? a[0] : a[0]-1;
}

void print(int *a) {
    printf("%d", a[a[0]]);
    for (int i=a[0]-1; i>0; i--) printf("%09d", a[i]);
}

int main() {
    freopen("path.in", "r", stdin);
    freopen("path.out", "w", stdout);

    static int ans[maxn+1][maxn+1][len], sum[maxn+1][maxn+1][len], temp[2][len], one[len]={1, 1};
    int n;
    scanf("%d", &n);
    for (int i=n-1; i>0; i--) {
        memcpy(temp[1], sum[n][i+2], sizeof temp[1]);
        for (int j=n; j>=1; j--) {
            add(temp[0], temp[1], ans[j][i+1]);
            memcpy(temp[1], temp[0], sizeof temp[1]);
        }
        for (int j=2; j<=n; j++) {
            dec(temp[0], temp[1], sum[j][i+1]);
            add(ans[j][i], temp[0], one);
            add(sum[j][i], sum[j][i+1], ans[j][i]);
            dec(temp[0], temp[1], ans[j-1][i+1]);
            memcpy(temp[1], temp[0], sizeof temp[1]);
        }
    }

    for (int i=1; i<=n; i++) {
        for (int j=1; j<=n; j++) {
            print(ans[i][j]);
            printf(" ");
        }
        printf("\n");
    }

    fclose(stdin);
    fclose(stdout);
    return 0;
}
